﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using My.Common.Helper.JqGrid;
using My.Common.Helper.Utils;
using My.Web.MVC.V4.Factory;
using NCLCustomerManagement.BusinessLogic.User;
using NCLCustomerManagement.Common.Exception;
using NCLCustomerManagement.DataTransferObjects.User;
using NCLCustomerManagement.UI.Controllers;
using NCLCustomerManagement.UI.Helper;
using NCLCustomerManagement.UI.Models.User;
using System.ComponentModel.DataAnnotations;
using NCLCustomerManagement.DataTransferObjects.History;

namespace NCLCustomerManagement.UI.Controllers
{
    public class UserController : BaseController
    {
        private IUserBC _userBC;

        private IBuildGridDataHelper<UserProfileModel> _buildGridDataHelper;

        public UserController(IBCFactory bcFactory, IBuildGridDataHelper<UserProfileModel> buildGridDataHelper)
        {
            _userBC = bcFactory.GetBC<IUserBC>();
            _buildGridDataHelper = buildGridDataHelper;

        }


        public ActionResult Login()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Login(LoginModel loginModel)
        {
            bool isAdmin;
            string manager;

            if (!ModelState.IsValid)
            {
                return View(loginModel);
            }

            if (_userBC.Authenticate(loginModel.Username, loginModel.Password, out isAdmin, out manager))
            {
                this.SaveUserInSession(loginModel.Username, isAdmin, manager);
                AddToHistory("Đăng nhập thành công", HistoryType.Login);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                ModelState.AddModelError("", "Username or Password is wrong");
                return View(loginModel);
            }

        }

        [AuthenticationRequired]

        public ActionResult Logout()
        {
            AddToHistory("Đăng xuất", HistoryType.Login);
            this.ClearCurrentUser();
            return View("Login");
        }

        [AuthenticationRequired]
        public ActionResult Index()
        {
            return View();
        }

        [AuthenticationRequired]
        public ActionResult New()
        {
            return View();
        }

        //public ActionResult Edit(string id)
        //{
        //    ViewData["EditMode"] = true;
        //    var user = _userBC.GetUserByUsername(id);
        //    if (user == null)
        //    {
        //        return View("Error");
        //    }

        //    return View(ConvertDTOToModel<UserProfileDTO, UserProfileModel>(user));
        //}
        [AuthenticationRequired]
        public JsonResult Delete(string[] deletedIds)
        {
            bool ok = true;

            try
            {
                foreach (var id in deletedIds)
                {
                    //var user = _userBC.GetUserByUsername(id);
                    AddToHistory(string.Format("Xóa User {0}", id));
                    _userBC.DeleteUser(id);
                }
            }
            catch
            {
                ok = false;
            }
            return Json(new { Success = ok }, JsonRequestBehavior.AllowGet);
        }

        [AuthenticationRequired]
        public JsonResult ActivateOrDeactivateUser(string username, bool activate)
        {
            string msg = "";
            bool ok = true;
            try
            {
                if (activate)
                {
                    _userBC.ActivateUser(username);
                    AddToHistory(string.Format("Khôi phục User {0}", username));
                    msg = "Khôi phục User thành công";
                }
                else
                {
                    _userBC.DeactivateUser(username);
                    AddToHistory(string.Format("Tạm ngưng hoạt động User {0}", username));
                    msg = "Đã tạm ngưng hoạt động của User";
                }
            }
            catch (Exception)
            {
                msg = "Rất tiếc. Không thể thực hiện thao tác này";
                ok = false;
            }
            return Json(new { Success = ok, Message = msg }, JsonRequestBehavior.AllowGet);
        }

        [AuthenticationRequired]
        public ActionResult CheckUserExists(string username)
        {
            var exist = _userBC.GetUserByUsername(username) != null;
            return Json(new { Exist = exist }, JsonRequestBehavior.AllowGet);
        }

        [AuthenticationRequired]
        public string GetUserListForBuildingGrid(string sortName = "Name",
            string sortOrder = "asc", int rowId = -1)
        {
            var userList = _userBC.GetUserListOf(this.GetCurrentUser().Username)
                          .Select(e => ConvertDTOToModel<UserProfileDTO, UserProfileModel>(e))
                          .ToList();
            return _buildGridDataHelper.BuildDataForGrid(userList, this.CreateUserListJson, sortName, sortOrder, rowId);
        }

        [AuthenticationRequired]

        public JsonResult AddUser(string userJson)
        {
            bool ok = true;
            string msg;
            try
            {
                var currentUser = this.GetCurrentUser();

                var user = JsSerializer.Deserialize<UserProfileModel>(userJson);
                user.Active = true;
                if (!user.IsAdmin)
                    user.ReportTo = currentUser.Username;
                user.Password = this.GenerateInitialPassword();

                _userBC.AddNewUser(ConvertModelToDTO<UserProfileModel, UserProfileDTO>(user));
                msg = "Đã thêm User";
                AddToHistory(string.Format("Thêm User {0}", user.Username));
            }
            catch (CannotSendMailException)
            {
                ok = false;
                msg = "Không thể gửi Email thông báo mật khẩu cho User. Hãy chắc chắn máy tính của bạn được kết nối Internet hoặc hãy thử lại sau.";
            }
            catch (Exception)
            {
                ok = false;
                msg = "Không thể thêm User";
            }
            return Json(new { Success = ok, Message = msg }, JsonRequestBehavior.AllowGet);
        }

        [AuthenticationRequired]
        public ActionResult ChangePassword()
        {
            return View();
        }

        [AuthenticationRequired]
        public ActionResult SubmitChangePassword(string model)
        {
            string msg = "";
            bool ok = true;


            var m = JsSerializer.Deserialize<ChangePasswordModel>(model);
            if (!string.IsNullOrEmpty(m.CurrentPassword))
                m.CurrentPassword = Hash.CalculateMD5Hash(m.CurrentPassword);
            var currentUser = this.GetCurrentUser();
            var currentPassword = _userBC.GetUserByUsername(currentUser.Username).Password;
            var errorList = ValidateChangePasswordModel(m, currentPassword).ToList();
            if (errorList.Count > 0)
            {
                ok = false;
                msg = string.Join("<br/>", errorList);
            }
            else
            {

                try
                {
                    _userBC.ChangePassword(currentUser.Username, m.NewPassword);
                    msg = "Mật khẩu của bạn đã được đổi";
                    AddToHistory(string.Format("Thay đổi mật khẩu"));
                }
                catch (Exception)
                {
                    msg = "Không thể đổi mật khẩu. Bạn hãy thử lại sau";
                    ok = false;
                }
            }
            return Json(new { Success = ok, Message = msg }, JsonRequestBehavior.AllowGet);
        }

        private IEnumerable<string> ValidateChangePasswordModel(ChangePasswordModel model, string currentPassword)
        {
            if (string.IsNullOrEmpty(model.CurrentPassword))
            {
                yield return "Bạn chưa nhập mật khẩu hiện tại";
            }
            else
            {
                if (model.CurrentPassword != currentPassword)
                {
                    yield return "Mật khẩu hiện tại không chính xác!";
                }
            }
            if (string.IsNullOrEmpty(model.NewPassword))
            {
                yield return "Bạn chưa nhập mật khẩu mới";
            }

        }

        [AuthenticationRequired]
        public JsonResult GetCurrentLoginUser()
        {
            return Json(this.GetCurrentUser(), JsonRequestBehavior.AllowGet);
        }
    }
}
